
Nombre:
Visión general del cracking con SoftICE
Herramientas:
SoftICE
Cerebro
Cracker:
LW2000
Tutorial:
número 27
Renuncia: Este tutorial tiene una finalidad únicamente
educativa. No asumo ninguna responsabilidad por el mal uso de éste material.
Bien, me han preguntado montones de veces por lo básico
en el cracking con SoftICE así que, ¡aquí va una pequeña Visión General!
Teclas en SoftICE |
|
|
Tecla |
Función |
|
F1 |
Ayuda |
|
F2 |
Alternar la ventana Register |
|
F5 |
Retornar a Windows/aplicación |
|
F8 |
Tracear siguiente instrucción (va dentro de los CALL) |
|
F10 |
Tracear siguiente instrucción (se salta los CALL) |
|
F11 |
Ir a la instrucción de llamada |
|
F12 |
Ejecutar hasta el siguiente RET |
Las ventanas de SoftICE |
|
|
WR |
Muestra/oculta la ventana Register |
|
WD |
Muestra/oculta la ventana Data |
|
WC |
Muestra/oculta la ventana Code |
|
WL |
Muestra/oculta la ventana Locals (Alt-l, recibe el foco) |
|
WW |
Muestra/oculta la ventana Watch (Alt-w, recibe el foco) |
Las teclas en SoftICE |
||
|
Ctrl |
Flecha arriba Flecha abajo RePág AvPág |
Desplaza la ventana Code |
|
Shift |
Flecha arriba Flecha abajo RePág AvPág |
Desplaza la ventana Command (introducción de comandos) |
|
Alt |
Flecha arriba Flecha abajo RePág AvPág |
Desplaza la ventana Data |
¡Hey, sí! ¡Lo ha adivinado! La ‘e’ en ‘EAX’ es por
que son de 32 bits.
Los Registros |
|
|
AX |
Registro acumulador |
|
BX |
Registro base |
|
CX |
Registro contador |
|
DX |
Registro de datos |
Cada uno de los anteriores registros de 16 bits puede
ser dividido en dos registros de 8 bits.
Los Registros (división) |
|
|
AH |
Registro acumulador alto |
|
AL |
Registro acumulador bajo |
|
BH |
Registro base alto |
|
BL |
Registro base bajo |
|
CH |
Registro contador alto |
|
CL |
Registro contador bajo |
|
DH |
Registro de datos alto |
|
DL |
Registro de datos bajo |
Registros de índice |
|
|
SI |
Indice fuente |
|
DI |
Indice destino |
Registros de pila |
|
|
BP |
Puntero a base |
|
SP |
Puntero a la pila |
Registros de segmento |
|
|
CS |
Segmento de código |
|
DS |
Segmento de datos |
|
ES |
Segmento extra |
|
SS |
Segmento de pila |
Por cierto: “D EAX” y “? EAX” muestran lo que hay
dentro del registro EAX.
Flags |
|
|
O |
Flag de desbordamiento (se activará después de un
comando matemático, por ejemplo ‘SUB’) |
|
D |
Flag de dirección (le dice a la CPU que incremente o decremente en instrucciones LODSB, STOSB, e instrucciones parecidas) |
|
I |
Flag de interrupción (le dice a la CPU si debe aceptar
entrada hardware) |
|
S |
Flag de signo (indica si el valor final tenía signo
o no) |
|
Z |
Flag de cero (indica si el valor final era cero
o no) |
|
A |
Flag auxiliar de acarreo |
|
P |
Flag de paridad |
|
C |
Flag de acarreo (como el flag de desbordamiento
pero se activa si se produce un desbordamiento en un entero sin signo) |
Comandos de manipulación de flags |
|
|
CLC |
Borrar flag de acarreo |
|
CLD |
Borrar flag de dirección |
|
CLI |
Borrar flag de interrupción |
|
CMC |
Complementar flag de acarreo |
|
STC |
Activar flag de acarreo |
|
STI |
Activar flag de interrupción |
A propósito: no se puede cambiar el flag de cero ni
el de signo mediante comando. Hay que usar “R FL Z” para cambiar el flag de
Cero y “R FL S” para cambiar el flag de Signo.
Los saltos |
|
|
JA |
Saltar si es mayor (sin signo) |
|
JAE |
Saltar si es mayor o igual (sin signo) |
|
JB |
Saltar si es menor (sin signo) |
|
JBE |
Saltar si es menor o igual (sin signo) |
|
JC |
Saltar si hay acarreo |
|
JCXZ |
Saltar si CX es cero |
|
JE |
Saltar si es igual |
|
JZ |
Saltar si es cero (igual) |
|
JG |
Saltar si es mayor (con signo) |
|
JGE |
Saltar si es mayor o igual (con signo) |
|
JL |
Saltar si es menor (con signo) |
|
JLE |
Saltar si es menor o igual (con signo) |
|
JNA |
Saltar si no es mayor (sin signo) |
|
JNAE |
Saltar si no es mayor o igual (sin signo, igual
que JB) |
|
JNB |
Saltar si no es menor (sin signo) |
|
JNBE |
Salta si no es menor o igual (sin singo) |
|
JNC |
Saltar si no hay acarreo |
|
JNE |
Saltar si no es igual |
|
JNG |
Saltar si no es mayor (con signo) |
|
JNGE |
Saltar si no es mayor o igual (con signo) |
|
JNL |
Saltar si no es menor (con signo) |
|
JNLE |
Saltar si no es menor o igual (con signo) |
|
JNO |
Saltar si no hay desbordamiento |
|
JNP |
Saltar si no hay paridad |
|
JNS |
Saltar si no tiene signo |
|
JNZ |
Saltar si no es cero (igual) |
|
JO |
Saltar si hay desbordamiento |
|
JP |
Saltar si hay paridad |
|
JPE |
Saltar si hay paridad par (PF = 1) |
|
JPO |
Saltar si hay paridad impar (PF = 0) |
|
JS |
Saltar si hay signo |
|
JZ |
Saltar si es cero (igual) |
‘MOV’ desplaza un valor a un registro a una posición
de memoria.
‘MOV CX,AX’: AX se guarda en CX
‘MOV [CX],AX: esto guarda AX en la posición de memoria
apuntada por CX.
Se usa ‘CALL’ y ‘RET’ para llamar y retornar de los
procedimientos. Si usted quiere que una función devuelva algo, lo más sencillo
es que guarde el valor de retorno en un registro y después haga un RET.
Ie., si una función debe retornar con EAX = 1, entonces
símplemente ponemos nuestro CALL así:
MOV EAX,1
RET
Como los registros, los llamadas al API difieren entre
16 bits y 32 bits. Si tenemos una víctima de 32 bits, símplemente añadimos
una ‘a’ al final del nombre de la función. Ie., ‘getWindowText’ sería ‘getWindowTextA’.
A propósito: ‘BL’ listará todos los breakpoint que tengamos establecidos.
Borrar breakpoints:
“BC suBreakpoint”; ie., “BC getDlgItemTextA” borrará
ése breakpoint
“BC 0”, borrará el breakpoint etiquetado como 0
“BC 1,3”, borrará los breakpoints etiquetados como
1 y 3
“BC *”, borrará todos los breakpoints que hayamos
establecido
Desactivar breakpoints:
“BD suBreakpoint”; ie., “BC getDlgItemTextA” desactivará
ése breakpoint
“BD 1,3,4”, desactivará los breakpoints etiquetados
como 1, 3 y 4
“BD *”, desactivará todos los breakpoints
Activar breakpoints:
“BE suBreakpoint”; ie., “BE getDlgItemTextA” activará
ése breakpoint
“BE 1,4,7”, activará los breakpoints etiquetados 1,
4 y 7
“BE *”, activará todos los breakpoints
Breakpoints útiles:
¡Recuerde poner un ‘a’ al final para las llamadas
al API de 32 bits!
General:
·
BPX messageBox
·
BPX getDlgItemText
·
BPX getWindowText
·
BPX hMemCpy
·
BPX showWindow
·
BPX upDateWindow
·
BMSG xxxx wm_getText
·
BMSG xxxx wm_command
·
BMSG xxxx wm_move
Relaccionadas con ficheros Key:
·
BPINT 21 if AH==3Dh (DOS)
·
BPINT 31 if AH==3Fh (DOS)
·
BPINT 21 if AH==3Dh (DOS)
·
BPX readFileA
·
BPX createFileA
Entrada por teclado:
·
BPINT 16 if AH==0 (DOS)
·
BPINT 21 if AH==0xA (DOS)
Relacionadas con la hora:
·
BPINT 21 if AH==2Ah (DOS)
·
BPX getLocalTime
·
BPX getFileTime
·
BPX getSystemTime
CD-ROM/Disco:
·
BPINT 13 if AH==2 (DOS)
·
BPINT 13 if AH==3 (DOS)
·
BPÌNT 13 if AH==4 (DOS)
·
BPX getFileAttributesA
·
BPX getFileSize
·
BPX getLastError
·
BPX readFile
·
BPIO –h (la dirección del puerto
de su CD-ROM) R
Cracking ‘dongle’:
·
BPIO –h 278 R
·
BPIO –h 378 R
¡Se acabó! Fácil, ¿no? ¿Algún comentario? Envíeme
un email a LW2000@gmx.net.
o vaya a http://www.LW2000.cjb.net
Gracias a tKC por sus tutoriales. Empecé leyendo su
primer tutorial y todavía sigo leyéndolos.
Traducción de: MeGaBiTe